﻿using CatUtils.Utils.Currency.TextUtils;
using System;
using System.Collections.Generic;

namespace CatUtils.Utils.Currency
{
    /// <summary>
    /// 打印日志的方法 写入日志文件的位置为  程序根目录 TempPath\\Log\\
    /// </summary>
    public partial class PrintLog
    {
        /// <summary>
        /// 错误提示类型
        /// </summary>
        public static class ErrorTypeName
        {
            /// <summary>
            /// 网络请求类错误
            /// </summary>
            public const string WebError = "WebError";
        }

        /// <summary>
        ///网络连接错误常见信息
        /// </summary>
        private static List<string> WebConnentError =
            new List<string>() { "System.Reflection.TargetInvocationException", "System.Net.WebException",
                "System.Net.Sockets.SocketException", "System.Net.Sockets.Socket.DoConnect" };

        /// <summary>
        ///  向用户打印错误日志，用中文提示。
        /// </summary>
        /// <param name="ErrorMessage"></param>
        /// <param name="ErrorType">错误类型，请调用ErrorTypeName下的参数以供匹配。</param>
        public static void PrintChinesLog(string ErrorMessage, string ErrorType)
        {
            PrintChinesLog(ErrorMessage, ErrorType, true);
        }

        /// <summary>
        /// 向用户打印错误日志，用中文提示。
        /// </summary>
        /// <param name="exception">报错信息</param>
        /// <param name="ErrorType">错误类型，请调用ErrorTypeName下的参数以供匹配。</param>

        public static void PrintChinesLog(Exception exception, string ErrorType)
        {
            PrintChinesLog(GetExceptionMessage(exception), ErrorType, true);
        }

        /// <summary>
        /// 向用户打印错误日志，用中文提示。
        /// </summary>
        /// <param name="exception">报错信息</param>
        /// <param name="ErrorType">错误类型，请调用ErrorTypeName下的参数以供匹配。</param>
        /// <param name="PrintToFile">打印到文件</param>
        public static void PrintChinesLog(Exception exception, string ErrorType, bool PrintToFile)
        {
            PrintChinesLog(GetExceptionMessage(exception), ErrorType, PrintToFile);
        }

        /// <summary>
        /// 向用户打印错误日志，用中文提示。
        /// </summary>
        /// <param name="ErrorMessage">报错信息</param>
        /// <param name="ErrorType">错误类型，请调用ErrorTypeName下的参数以供匹配。</param>
        /// <param name="PrintToFile">打印到文件</param>

        public static void PrintChinesLog(string ErrorMessage, string ErrorType, bool PrintToFile)
        {
            string ChinesLog = GetChinesLog(ErrorMessage, ErrorType, PrintToFile);
            if (PrintToFile)
                E(ChinesLog);
            else
                E(ChinesLog);
        }

        /// <summary>
        ///获取错误，并翻译为中文可以理解的错误。 当前类尚在开发中。
        /// </summary>
        /// <param name="ErrorMessage">错误文本信息</param>
        /// <param name="ErrorType">错误类型，请参考 ErrorTypeName</param>
        /// <returns></returns>
        public static string GetChinesLog(string ErrorMessage, string ErrorType)
        {
            return GetChinesLog(ErrorMessage, ErrorType, false);
        }

        /// <summary>
        ///获取错误，并翻译为中文可以理解的错误。 当前类尚在开发中。
        /// </summary>
        /// <param name="exception">错误信息</param>
        /// <param name="ErrorType">错误类型，请参考 ErrorTypeName</param>
        /// <returns></returns>
        public static string GetChinesLog(Exception exception, string ErrorType)
        {
            return GetChinesLog(GetExceptionMessage(exception), ErrorType, false);
        }

        /// <summary>
        ///获取错误，并翻译为中文可以理解的错误。 当前类尚在开发中。
        /// </summary>
        /// <param name="exception">错误信息</param>
        /// <param name="ErrorType">错误类型，请参考 ErrorTypeName</param>
        /// <param name="GetTipsOnly">为True仅仅获取提示，不输出全部报错信息</param>
        /// <returns></returns>
        public static string GetChinesLog(Exception exception, string ErrorType, bool GetTipsOnly)
        {
            return GetChinesLog(GetExceptionMessage(exception), ErrorType, false);
        }

        /// <summary>
        ///获取错误，并翻译为中文可以理解的错误。 当前类尚在开发中。
        /// </summary>
        /// <param name="ErrorMessage">错误文本信息</param>
        /// <param name="ErrorType">错误类型，请参考 ErrorTypeName</param>
        /// <param name="GetTipsOnly">为True仅仅获取提示，不输出全部报错信息</param>
        /// <returns></returns>
        public static string GetChinesLog(string ErrorMessage, string ErrorType, bool GetTipsOnly)
        {
            string ErrorTip = "错误类型中文提示：{0}\r\n";

            switch (ErrorType)
            {
                case ErrorTypeName.WebError:
                    if (ListHelper.CompareRepetition(ErrorMessage, WebConnentError, false))
                    {
                        ErrorTip += "服务器拒绝响应、网络不通或网络代理失效，请检查网络代理，或者在IE浏览器中取消所有代理。\r\n" + ErrorMessage;
                    }
                    break;
            }

            if (GetTipsOnly)
            {
                return string.Format(ErrorTip, "");
            }
            else
                return $"{string.Format(ErrorTip, "")}\r\n{ErrorMessage}";
        }
    }
}